package com.yc.tank;

import java.util.Random;

/**
 * 机器大脑
 * 用于自主控制机器人
 * @author Administrator
 *
 */
public class MachineBrain {

	private TankFrame tf;
	private Tank tank;
	private Random random = new Random();
	final static int dangerDis = 20;//危险碰撞距离
	
	public MachineBrain(TankFrame tf, Tank tank) {
		super();
		this.tf = tf;
		this.tank = tank;
	}

	private final Dir[] dirAr = new Dir[] {Dir.LIFT, Dir.UP, Dir.RIGHT, Dir.DOWN};
	private final int[] dirNu = new int[] {1, 1, 1, 1};
	
	/**
	 * 下次的方向
	 * @return
	 */
	public Dir nextDir() {
		//获取当前方向
		Dir curDir = tank.getDir();
		int nextD = curDir.getIndex();//默认还是原来的方向
		//判断和该方向上的边界的距离
		int tankX = tank.getX();
		int tankY = tank.getY();
		
		boolean pre = true;
		
		if (tankX < dangerDis) {
			dirNu[0] = 0;//不能往左走
			if (nextD == 0) {
				pre = false;//原方向不能走
			}
		}
		if (tankY < dangerDis) {
			dirNu[1] = 0;//不能往上走
			if (nextD == 1) {
				pre = false;//原方向不能走
			}
		}
		if (tankX > tf.GAME_WIDTH-dangerDis) {
			dirNu[2] = 0;//不能往右走
			if (nextD == 2) {
				pre = false;//原方向不能走
			}
		}
		if (tankY > tf.GAME_HEIGTH-dangerDis) {
			dirNu[3] = 0;//不能往右走
			if (nextD == 3) {
				pre = false;//原方向不能走
			}
		}
		
		//如果原方向不能走了 || 到了随机选方向的时候了：找出第一个能走的方向
		int rd = random.nextInt(4000);
		if (!pre || rd < 40) {
			//随机的选一个数，直到选到一个可以走的
			int tryNum = 0;
			for(nextD = random.nextInt(4); dirNu[nextD] != 1; tryNum++){
				if (tryNum > 7) {
					//如果随机数尝试7次还是同一个不合适的数，那么取第一个合适的方向
					for (int i = 0; i < dirNu.length; i++) {
						if (dirNu[i] == 1) {
							nextD = i;
							break;
						}
					}
					break;
				}
					
			}
			
		}
		
		//恢复dirNu
		dirNu[0] = 1;
		dirNu[1] = 1;
		dirNu[2] = 1;
		dirNu[3] = 1;
		
		return dirAr[nextD];
	}
	
	/**
	 * 下次的方向
	 * @return
	 */
	public boolean nextFire() {
		int rd = random.nextInt(4000);
		if (rd < 100)
			return true;
		return false;
	}
}
